class Solution {
public:
    const int L=10;
    unordered_map<int, int> Get={{'A', 0}, {'C', 1}, {'G', 2}, {'T', 3}};
    vector<string> findRepeatedDnaSequences(string s) {
        vector<string> ans;
        unordered_map<int, int> cnt;
        int n=s.size();
        int x=0, i=0;
        for(; i<L-1; i++) //把前九位移入
            x=(x<<2)|Get[s[i]];
        for(; i<n; i++) //从第10位开始
        {
            x=((x<<2)|Get[s[i]])&((1<<20)-1); //移除最高位的两位
            if(cnt[x]++==1)
                ans.push_back(s.substr(i-L+1, L));
        }
        return ans;
    }
};